﻿/*******************************************************
* Copyright (c) 2018-2088, By XuXiang all rights reserved.
*
* FileName: NetDefine.h
* Summary: 网络相关定义定义。
*
* Author: XuXiang
* Date: 2024-04-10 09:45
*******************************************************/

#ifndef __NetDefine_h__
#define __NetDefine_h__

#include "../Macro.h"
#if defined(WIN)
#include <WinSock2.h>
#else
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/epoll.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <execinfo.h>
#include <netdb.h>
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <sys/un.h>
#endif

namespace Competition
{
	namespace Net
	{
		//远端类型。
		enum RemoteType
		{
			//未知
			RT_UNKNOW = 0,

			//玩家客户端。
			RT_CLIENT = 1,

			//唤醒者
			RT_AWAKER = 2,

			//游戏服
			RT_GAME = 3,

			//战斗服
			RT_FIGHT = 4,
		};

		//远端唯一标识。
		typedef std::pair<int, Int64> RemoteKey;

#if defined(WIN)
		typedef SOCKET socket_t;
		typedef int socklen_t;
#define SAFE_CLOSE_SOCKET(s) if (s!=SOCKET_ERROR){::closesocket(s); s=SOCKET_ERROR;}
#define GET_LAST_ERROR() WSAGetLastError()
#else
#define SOCKET_ERROR (-1)
		typedef int socket_t;
#define SAFE_CLOSE_SOCKET(s) if (s!=SOCKET_ERROR){::close(s); s=SOCKET_ERROR;}
#define GET_LAST_ERROR() (errno)
#endif

		//设置socket是否为非阻塞模式
		extern bool socket_set_nonblocking(socket_t s, bool on);

		//将字符串格式的ip地址赋值为数字格式
		extern int ip_to_addr(const char *ip, struct in_addr *addr);

		//网络缓冲区大小
		const int NET_BUFFER_SIZE = 256 * 1024;

		//网络数据包最大尺寸
		const int NET_PACKAGE_MAX_SIZE = 16 * 1024;

		//网络消息号
		//消息约定规则如下:
		//1、1-999 为系统内部使用。
		//2、千位以上为功能模块标识，每个功能模块有最多999个协议号。
		//3、模块内1-399为客户端请求，401-799为服务器回复和通知，801-999为数据库通信。
		//4、消息号定义到各自协议头文件中，由协议工具自动生成。
		namespace MsgID
		{
			const Int32 REMOTE_IDENTIFY = 1;						//远端标识
			const Int32 INTERNAL_AWAKE = 2;							//内部唤醒
			const Int32 CS_HEART_BEAT = 3;							//心跳请求
			const Int32 SC_HEART_BEAT = 4;							//心跳回复
		}
	}
}

#endif